home *** CD-ROM | disk | FTP | other *** search
/ 10,000 Great Games / 10,000 Great Games.iso / Product / 66 / data1.cab / Source_Files / Src / LoadSave.cpp < prev    next >
C/C++ Source or Header  |  2000-01-16  |  5KB  |  241 lines

  1. #include "stdafx.h"
  2.  
  3. static CFile *save_file;
  4. static int paste_game_y_start, paste_back_y_start, copy_paste_mode = FALSE;
  5.  
  6. int load_y_offset(cSurface *surface)
  7. {
  8.     if (!copy_paste_mode)
  9.         return 0;
  10.  
  11.     if (surface == game_surface)
  12.         return game_surface->start - paste_game_y_start;
  13.  
  14.     if (surface == back_surface)
  15.         return back_surface->start - paste_back_y_start;
  16.  
  17.     return 0;
  18. }
  19.  
  20. static void load_cutfile(cParse *list)
  21. {    
  22.     paste_game_y_start = list->get_int("GAMESTART");
  23.     paste_back_y_start = list->get_int("BACKSTART");
  24. }
  25.  
  26. static void load_object(char *type, cParse *list)
  27. {
  28.     cProperties *p = cProperties::find_w_error(type, list->get_string("NAME"));
  29.  
  30.     int x = list->get_int("X"),
  31.         y = list->get_int("Y") + load_y_offset(*p->objtype->surface);
  32.  
  33.     cGameObject *g = cObjectTypes::make(x, y, p);
  34.  
  35.     g->load(list);
  36.  
  37.     if (copy_paste_mode)
  38.         g->create_editables(TRUE);
  39. }
  40.  
  41. void load_level(CFile *f, int paste)
  42. {
  43.     // Set mode
  44.  
  45.     copy_paste_mode = paste;
  46.     
  47.     // Load loadable parts
  48.  
  49.     cParse *lvl = 0, *type = 0, *object = 0;
  50.  
  51.     cParse::parse_file(f, &lvl);
  52.     
  53.     // Process parts
  54.     
  55.     for (;;)
  56.     {
  57.         if (lvl == 0 || lvl->cmp("TYPE"))
  58.         {
  59.             // First process old object
  60.             
  61.             if (type != 0)
  62.             {
  63.                 if (eq(type->value, "BLASTER LEVEL"))
  64.                     level->make(object);
  65.                 else if (eq(type->value, "CUT FILE"))
  66.                     load_cutfile(object);
  67.                 else
  68.                     load_object(type->value, object);
  69.  
  70.                 object->delete_list();
  71.                 type->delete_list();
  72.             }
  73.             
  74.             // Store new type or end loop
  75.             
  76.             if (lvl != 0)
  77.                 lvl->relink((cList **)&type);
  78.             else
  79.                 break;
  80.         }
  81.         
  82.         else
  83.             lvl->relink_end((cList **)&object);
  84.     }
  85.  
  86.     // End of copy/paste mode
  87.  
  88.     copy_paste_mode = FALSE;
  89.  
  90.     // Create editables
  91.  
  92.     cEditable::make_editables();
  93.  
  94.     // Sort objects
  95.  
  96.     update_onscreen_list();
  97. }
  98.  
  99. void load_level(char *name, int paste)
  100. {
  101.     TRY
  102.     {
  103.         CFile f(name, CFile::modeRead | CFile::shareDenyWrite);
  104.     
  105.         load_level(&f, paste);
  106.     }
  107.     CATCH(CFileException, e)
  108.     {
  109.         error("Unable to load level %s", name);
  110.     }
  111.     END_CATCH
  112. }
  113.  
  114. static void save_cutfile()
  115. {
  116.     save_level_string("TYPE", "CUT FILE");
  117.     
  118.     save_level_int("GAMESTART", game_surface->start);
  119.     save_level_int("BACKSTART", back_surface->start);
  120. }
  121.  
  122. static void save_object(cGameObject *o)
  123. {
  124.     o->save();
  125.  
  126.     save_file->Write("\n", 1);
  127. }
  128.  
  129. static void save_all(cGameObject *list)
  130. {
  131.     for (cGameObject *o = list; o != 0; o = (cGameObject *)o->next)
  132.         if (!copy_paste_mode || (o->editable != 0 && o->editable->selected))
  133.             save_object(o);
  134. }
  135.  
  136. void save_level(CFile *f, int copy)
  137. {
  138.     // Set mode
  139.  
  140.     copy_paste_mode = copy;
  141.  
  142.     // Store file pointer
  143.  
  144.     save_file = f;
  145.  
  146.     // Save level object
  147.  
  148.     if (!copy_paste_mode)
  149.         level->save();        
  150.     else
  151.         save_cutfile();
  152.         
  153.     save_file->Write("\n", 1);
  154.     
  155.     // Save other objects in objtypes list
  156.  
  157.     for (int i = 0; objtypes[i].type != 0; i++)
  158.         if (!objtypes[i].list_occured_earlier)
  159.         {
  160.             save_all(*objtypes[i].belowscreen);
  161.             save_all(*objtypes[i].onscreen);            
  162.             save_all(*objtypes[i].abovescreen);
  163.         }
  164.  
  165.     // End of copy/paste mode
  166.  
  167.     copy_paste_mode = FALSE;
  168. }
  169.  
  170. void save_level(char *name, int copy)
  171. {
  172.     TRY
  173.     {
  174.         CFile f(name, CFile::modeCreate | CFile::modeWrite | CFile::shareExclusive);
  175.  
  176.         save_level(&f, copy);
  177.     }
  178.     CATCH(CFileException, e)
  179.     {
  180.         error("Unable to save level %s", name);
  181.     }
  182.     END_CATCH
  183. }
  184.  
  185. void save_level_string(char *label, char *value)
  186. {
  187.     char *s = construct("%s=%s;", label, value);
  188.     save_file->Write(s, strlen(s));
  189. }
  190.  
  191. void save_level_int(char *label, int value)
  192. {
  193.     char *s = construct("%s=%d;", label, value);
  194.     save_file->Write(s, strlen(s));
  195. }
  196.  
  197. void save_level_fix(char *label, fix value)
  198. {
  199.     char *s = construct("%s=%lg;", label, (double)value);
  200.     save_file->Write(s, strlen(s));
  201. }
  202.  
  203. void save_level_spot(char *label, cSpot *spot)
  204. {
  205.     char *s = construct("%s=%d,%d;", label, spot->x, spot->y);
  206.     save_file->Write(s, strlen(s));
  207. }
  208.  
  209. void kill_level()
  210. {    
  211.     // Delete editables
  212.  
  213.     cEditable::delete_editables();
  214.     
  215.     // Delete standard game objects
  216.  
  217.     for (int i = 0; objtypes[i].type != 0; i++)
  218.     {
  219.         (*objtypes[i].belowscreen)->delete_list();
  220.         (*objtypes[i].onscreen)->delete_list();        
  221.         (*objtypes[i].abovescreen)->delete_list();
  222.     }
  223.  
  224.     // Delete some other objects
  225.  
  226.     scores->delete_list();
  227.     bubbles->delete_list();
  228.     players->delete_list(); 
  229.     disaster->delete_list();
  230.     texts->delete_list();
  231.     images_left->delete_list();
  232.     images_right->delete_list();
  233.     texts_left->delete_list();
  234.     texts_right->delete_list();
  235.  
  236.     // And last but not least (can be generated by deleting other objects)
  237.     
  238.     parts->delete_list();
  239.     effects->delete_list();
  240. }
  241.